from buscador.forms import DetalleBuscarForm
from dajax.core import Dajax
from dajaxice.decorators import dajaxice_register
from dajaxice.utils import deserialize_form
from datos_taxonomicos.models import Especie, Genero
from detalles_especie.models import DetalleEspecie
from django.template.context import RequestContext
from django.template.loader import render_to_string
from tipos_migracion.forms import TipoMigracionForm

@dajaxice_register
def sendTiposMigForm(request, form):
    dajax = Dajax()
    form = TipoMigracionForm(deserialize_form(form))

    if form.is_valid():
        dajax.remove_css_class('#my_form input', 'error')
        form.save()
    else:
        dajax.remove_css_class('#my_form input', 'error')
        for error in form.errors:
            dajax.add_css_class('#id_%s' % error, 'error')

    return dajax.json()

@dajaxice_register
def cambiar_otros_select_orden(request, form):
    dajax = Dajax()
    form_detalle = DetalleBuscarForm(deserialize_form(form))
    detalles = None
    if form_detalle.is_valid():
        orden = form_detalle.cleaned_data['orden']
        if orden:
            form_detalle = DetalleBuscarForm(deserialize_form(form),orden=orden)
    if orden:
        detalles = None
    render = render_to_string('detalles_especie/lista_filtrar.html',{'detalles':detalles,'form':form_detalle},RequestContext(request))
    dajax.assign('#lista_filtrar','innerHTML',render)   
    return dajax.json()


@dajaxice_register
def cambiar_otros_select_familia(request, form):
    dajax = Dajax()
    detalles = None
    form_detalle = DetalleBuscarForm(deserialize_form(form))

    if form_detalle.is_valid():
        familia = form_detalle.cleaned_data['familia']
        form_a_enviar = deserialize_form(form)
        if familia:
            form_a_enviar = deserialize_form(form).copy()
            if familia.orden:
                form_a_enviar['orden'] = familia.orden.id 
        form_detalle = DetalleBuscarForm(form_a_enviar,familia=familia)
    render = render_to_string('detalles_especie/lista_filtrar.html',{'detalles':detalles,'form':form_detalle},RequestContext(request))
    dajax.assign('#lista_filtrar','innerHTML',render)   
    return dajax.json()


@dajaxice_register
def cambiar_otros_select_genero(request, form):
    dajax = Dajax()
    form_detalle = DetalleBuscarForm(deserialize_form(form))
    detalles = None
    if form_detalle.is_valid():
        genero = form_detalle.cleaned_data['genero']
        if genero:
            if genero.familia:
                form_a_enviar = deserialize_form(form).copy()
                form_a_enviar['familia'] = genero.familia.id
                if genero.familia.orden:
                    form_a_enviar['orden'] = genero.familia.orden.id
                form_detalle = DetalleBuscarForm(form_a_enviar)
    if genero:
        detalles = None
    render = render_to_string('detalles_especie/lista_filtrar.html',{'detalles':detalles,'form':form_detalle},RequestContext(request))
    dajax.assign('#lista_filtrar','innerHTML',render)   
    return dajax.json()


@dajaxice_register
def cambiar_otros_select_especie(request, form):
    dajax = Dajax()
    form_detalle = DetalleBuscarForm(deserialize_form(form))
    detalles = None
    if form_detalle.is_valid():
        especie = form_detalle.cleaned_data['especie']
        if especie:
            if especie.genero:
                form_a_enviar = deserialize_form(form).copy()
                form_a_enviar['genero'] = especie.genero.id
                if especie.genero.familia:
                    form_a_enviar['familia'] = especie.genero.familia.id
                    if especie.genero.familia.orden:
                        form_a_enviar['orden'] = especie.genero.familia.orden.id
                form_detalle = DetalleBuscarForm(form_a_enviar)
    if especie:
        detalles = None
    render = render_to_string('detalles_especie/lista_filtrar.html',{'detalles':detalles,'form':form_detalle},RequestContext(request))
    dajax.assign('#lista_filtrar','innerHTML',render)   
    return dajax.json()



@dajaxice_register
def buscar_detalles(request, form):
    dajax = Dajax()
    form_detalle = DetalleBuscarForm(deserialize_form(form))
    detalles = None
    if form_detalle.is_valid():
        texto_busqueda = form_detalle.cleaned_data['nombre_busqueda']
        estado_de_conservacion = form_detalle.cleaned_data['estado_de_conservacion']
        tipo_de_migracion = form_detalle.cleaned_data['tipo_de_migracion']
        orden = form_detalle.cleaned_data['orden']
        familia = form_detalle.cleaned_data['familia']
        genero = form_detalle.cleaned_data['genero']
        especie = form_detalle.cleaned_data['especie']
        pais = form_detalle.cleaned_data['pais']
        detalles = DetalleEspecie.objects
        if texto_busqueda:
            detalles = detalles.filter(nombre__icontains = texto_busqueda)
        if estado_de_conservacion:
            detalles = detalles.filter(estado = estado_de_conservacion)
        if tipo_de_migracion:
            detalles = detalles.filter(tipo_migracion = tipo_de_migracion)
        if orden:
            detalles = detalles.filter(datos__genero__familia__orden = orden)
        if familia:
            detalles = detalles.filter(datos__genero__familia = familia)
        if genero:
            detalles = detalles.filter(datos__genero = genero) 
        if especie:
            detalles = detalles.filter(datos__nombre__icontains = especie, datos__real_type__name = 'especie')  
        if pais:
            detalles = detalles.filter(detalleregion__pais = pais)
        if detalles == DetalleEspecie.objects:
            detalles = None
        else:
            detalles = detalles.filter(aprobado = True)
    render = render_to_string('detalles_especie/lista_filtrar.html',{'detalles':detalles,'form':form_detalle},RequestContext(request))
    dajax.assign('#lista_filtrar','innerHTML',render)   
    return dajax.json()
    
    